﻿using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Shielded.Gossip
{
    /// <summary>
    /// 处理消息的委托。结果将是一个回复消息，可能为null。
    /// 这样做有助于重用相同的连接进行回复，对于具有连接概念的传输层来说。
    /// </summary>
    public delegate object MessageHandler(object message);

    /// <summary>
    /// 如果您希望使用自定义的通信方式在gossip节点之间进行通信，请实现此接口。
    /// 此库包含 <see cref="TcpTransport"/>，但应该很容易使用您想要的任何东西。
    /// </summary>
    public interface ITransport : IDisposable
    {
        /// <summary>
        /// 获取此服务器的ID。
        /// </summary>
        string OwnId { get; }

        /// <summary>
        /// 获取参与集群的所有其他服务器的集合。
        /// </summary>
        ICollection<string> Servers { get; }

        /// <summary>
        /// 向所有服务器发送消息。发送即忘记，不应抛出异常。
        /// </summary>
        void Broadcast(object msg);

        /// <summary>
        /// 向特定服务器发送消息。发送即忘记，不应抛出异常。
        /// replyExpected参数可用于保持连接打开，如果传输层有这种概念的话，
        /// 这可能会更高效。
        /// </summary>
        void Send(string server, object msg, bool replyExpected);

        /// <summary>
        /// 传入消息的处理程序。后端将设置此属性。调用它的结果将是回复消息，
        /// 如果不需要回复则为null。
        /// </summary>
        MessageHandler MessageHandler { get; set; }

        void Start();
    }
}
